/*
又称之为协商缓存
*/

const http = require('http');
const path = require('path');
const fs = require('fs');
const crypto = require('crypto');
http.createServer((req, res) => {
  let {pathname} = require('url').parse(req.url);
  console.log('pathname:',pathname);
  if(pathname === '/favicon.ico') return res.end(); //网站小图标 这个请求是随机发送的(?)
  let absPath = path.join(__dirname, pathname);
  fs.stat(absPath,(err,statObj)=>{
    if(err){
      res.statusCode = 404;
      return res.end();
    }
    if(statObj.isFile()){
      // no-store 表示的是不缓存
      // no-cache 缓存但是每次都像服务器发请求
      res.setHeader('Cache-Control','no-cache');


      //1)
      if (req.headers['if-modified-since'] === statObj.mtime.toGMTString()) {
        res.statusCode = 304;
        return res.end();
      }
      /*
        | 参数  |含义|
        |---|---|
        |atime   |文件访问时间|
        |ctime   |改变文件属性|
        |mtime   |修改文件内容|
      */
      //最短比较间隔是1s 也就是说如果用户1s内访问了n次 ... emmm... 这样的用户一定是robot
      res.setHeader('Last-Modified', statObj.mtime.toGMTString()); //ctime->changeTime
      //↑一旦设置了这个头以后，下次请求
      //请求头中会带上：If-Modified-Since: Wed, 06 Nov 2019 17:49:22 GMT (这个时间就是↑设置的时间，下次请求时会请求时会拿这个时间和我们新获取的时间做比较)



      //2)
      /*const fileContent = fs.readFileSync(absPath, 'utf8');
      const md5 = crypto.createHash('md5').update(fileContent).digest('base64');
      if (req.headers['if-none-match'] && req.headers['if-none-match'] === md5) {
        res.statusCode = 304;
        return res.end();
      }
      res.setHeader('Etag', md5); //更严谨 但消耗性能(实际感觉和mtime是一样的)
      //下次请求头中会带上 If-None-Match: Dnb3Db9DXFSQe8BLZwJ8lA== ←这个就是↑设置的md5*/

      fs.createReadStream(absPath).pipe(res);
    }
  })
}).listen(3005,()=>{
  console.log(`server is running at 3005`);
});
